package com.spirngcloud.alibabasentinelratelimiting.controller.mq.letter;

import com.google.common.collect.Maps;
import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.Map;

/**
 * @version V1.0
 * @Author 宋聚智
 * @Date 2019/10/24 14:45
 * @description
 * @Modify By：
 * @ModifyTime： 2019/10/24
 * @Modify marker：
 **/
@Configuration
public class DelayRabbitConfig {
    //延迟队列TTL 名称
    public static final String order_delay_queue="a.user.order.delay.queue";
    /*
     *DLX,deal letter 发送到的exchange
     * 延时消息就是发送到该交换机的
     */
    public static final String order_delay_exchange="a.user.order.delay.exchange";

    /*
     *routingKey 名称
     *具体消息发送在routingKey
     */
    public static final String order_dalay_routing_key="a.order_delay";

    public static final String order_queue_name="a.user.order.queue";

    public static final String order_exchange_name="a.user.order.exchange";

    public static final String order_routing_key="a.order";


    /**
     * 延迟队列配置
     * params.put("x-message-ttl",5*1000)
     * 第一种方式直接设置queue的延迟时间，但是如果直接给队列设置过期使劲按，这种作法非常不灵活
     * 第二种 message。getMessageProperties().setExpiration(2*1000+"")
     * 第二种就是每次发送消息自动设置延迟时间，这样我们可以灵活配置
     */
    @Bean
    public Queue delayOrderQueue(){
        Map<String,Object> params= Maps.newHashMap();
        //x-dead-letter-exchange 声明了队列里的死信转发的DLX 名称
        params.put("x-dead-letter-exchange",order_exchange_name);
        //x-deal-letter_routing-key 声明了这些死信在转发时携带routing_key名称
        params.put("x-dead-letter-routing-key",order_routing_key);
        return new Queue(order_delay_queue,true,false,false,params);

    }

    /**
     * 需要将一个队列绑定到交换机上，要求该消息与一个特定的路由完全匹配
     * 这是一个完整的匹配，如果一个队列绑定到该交换机上要有路由键“dog”,则只有被标记为“dog”的消息才被转发
     * 不会转发dog.puppy，
     */
    @Bean
    public DirectExchange orderDelayExchange(){
        return new DirectExchange(order_delay_exchange);
    }
    @Bean
    public Binding dlxBinding(){
        return BindingBuilder.bind(delayOrderQueue()).to(orderDelayExchange()).with(order_dalay_routing_key);
    }

    // durable 持久的
    @Bean
    public Queue orderQueue(){
        return new Queue(order_queue_name,true);
    }

    /**
     * 将路由键和某模式进行匹配，此时队列需要绑定到一个模式上
     * 符号“#”匹配一个或多个词，符号“*”匹配不多不少一个词。
     * 因此“audit.#”能够匹配到“audit.irs.corporate”，
     * 但是“audit.*” 只会匹配到“audit.irs”
     * @return
     */
    @Bean
    public TopicExchange orderTopicExchange(){
        return new TopicExchange(order_exchange_name);
    }
    @Bean
    public Binding orderBinding(){
        return BindingBuilder.bind(orderQueue()).to(orderTopicExchange()).with(order_routing_key);
    }

}
